package com.zlm.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zlm.common.Result;
import com.zlm.dto.DishDto;
import com.zlm.entity.Dish;
import com.zlm.entity.DishFlavor;
import com.zlm.mapper.DishMapper;
import com.zlm.service.DishFlavorService;
import com.zlm.service.DishService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;


@Slf4j
@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {

    @Autowired
    private DishFlavorService dishFlavorService;

    /**
     * 新增菜品同时保存对应的口味数据
     *
     * @param dishDto
     * @return
     */
    @Override
    @Transactional  // 开启事务
    public Result<String> saveWithFlavor(DishDto dishDto) {
        // 保存我们菜品的基本信息到我们的菜品表dish
        save(dishDto);

        // 菜品id
        Long dishId = dishDto.getId();
        // 菜品口味(我们直接从前端获取的东西里面没有菜品的id 所以我们要通过手动的
        // 形式来实现)
        List<DishFlavor> flavors = dishDto.getFlavors();
        flavors = flavors.stream().map((item) -> {
            item.setDishId(dishId);
            return item;
        }).collect(Collectors.toList());
        // 保存菜品口味数据到菜品口味表
        dishFlavorService.saveBatch(dishDto.getFlavors());

        return Result.success("新增菜品成功");
    }

    /**
     * 根据id查询菜品信息和对应的口味信息
     *
     * @param id
     * @return
     */
    @Override
    public Result<DishDto> getByIdWithFlavor(Long id) {
        // 查询菜品的基本信息
        Dish dish = getById(id);

        DishDto dishDto = new DishDto();

        // 属性赋值(赋值那些基本信息)
        BeanUtil.copyProperties(dish, dishDto);

        // 根据我们查询到的id来查询我们的口味有哪些
        LambdaQueryWrapper<DishFlavor> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(DishFlavor::getDishId, dish.getId());
        List<DishFlavor> list = dishFlavorService.list(lambdaQueryWrapper);
        dishDto.setFlavors(list);
        return Result.success(dishDto);
    }

    /**
     * 修改菜品同时保存对应的口味数据
     *
     * @param dishDto
     * @return
     */
    @Override
    @Transactional  // 开启事务
    public Result<String> updateWithFlavor(DishDto dishDto) {
        // 保存我们菜品的基本信息到我们的菜品表dish
        updateById(dishDto);

        // 清理当前菜品对应口味数据---dish_flavor表的delete的操作
        LambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper();
        queryWrapper.eq(DishFlavor::getDishId, dishDto.getId());
        dishFlavorService.remove(queryWrapper);

        // 现在我们在重新加入数据
        List<DishFlavor> flavors = dishDto.getFlavors();

        // 为我们每一场set我们的dishid
        flavors = flavors.stream().map((item) -> {
            item.setDishId(dishDto.getId());
            return item;
        }).collect(Collectors.toList());

        dishFlavorService.saveBatch(flavors);

        return Result.success("修改菜品成功");
    }



}
